package commonstruct

import (
	wr "github.com/mroth/weightedrand"
	"sort"
	"sync"
)

//----------------获取room---------------------//

type RoomResponse struct {
	Data RoomData `json:"data"`
}
type RoomData struct {
	Info RoomInfo `json:"info"`
}
type RoomInfo struct {
	RoomId       int64  `json:"room_id"`
	AnchorOpenId string `json:"anchor_open_id"`
	AvatarUrl    string `json:"avatar_url"`
	NickName     string `json:"nick_name"`
}

//----------------获取AccessToken---------------------//

//todo token info

type TokenInfo struct {
	AccessToken string `json:"access_token"`
	ExpiresIn   int    `json:"expires_in"`
}

type GetAccessTokenResponse struct {
	ErrNo   int       `json:"err_no"`
	ErrTips string    `json:"err_tips"`
	Data    TokenInfo `json:"data"`
}

//----------------获取TaskStatus---------------------//

type TaskStatusResponse struct {
	ErrNo  int            `json:"err_no"`
	ErrMsg string         `json:"err_msg"`
	Logid  string         `json:"logid"`
	Data   TaskStatusInfo `json:"data"`
}
type TaskStatusInfo struct {
	Status int `json:"status"`
}

//----------------获取 TaskStartInfo---------------------//

type TaskStartInfo struct {
	TaskId string `json:"task_id"`
}
type TaskStartResponse struct {
	ErrNo  int           `json:"err_no"`
	ErrMsg string        `json:"err_msg"`
	Logid  string        `json:"logid"`
	Data   TaskStartInfo `json:"data"`
}

//----------------获取 TaskTopGiftResponse---------------------//

type TaskTopGiftResponse struct {
	ErrNo  int             `json:"err_no"`
	ErrMsg string          `json:"err_msg"`
	Logid  string          `json:"logid"`
	Data   TaskTopGiftInfo `json:"data"`
}

type TaskTopGiftInfo struct {
	SuccessTopGiftIdList []string `json:"success_top_gift_id_list"`
}

//----------------获取 TaskFailDataResponse---------------------//

type TaskFailDataResponse struct {
	ErrNo  int              `json:"err_no"`
	ErrMsg string           `json:"err_msg"`
	Logid  string           `json:"logid"`
	Data   TaskFailDataInfo `json:"data"`
}
type TaskFailDataInfo struct {
	PageNum    int                `json:"page_num"`
	TotalCount int                `json:"total_count"`
	DataList   []TaskFailDataItem `json:"data_list"`
}
type TaskFailDataItem struct {
	RoomId  string `json:"room_id"`
	MsgType string `json:"msg_type"`
	Payload string `json:"payload"`
}

//********************************获取题库

type QuizResponse struct {
	Data struct {
		List []struct {
			Title   string   `json:"title"`
			Options []string `json:"options"`
			Answer  int      `json:"answer"`
			Id      string   `json:"id"`
		} `json:"list"`
	} `json:"data"`
}

type DanceProblemTran struct {
	//Id      string `gorm:"primaryKey;autoIncrement;comment:id" json:"id"`
	//Content string `json:"content" gorm:"column:content;type:varchar(100);not null;default:'';comment:题的内容"`
	//AnswerA string `json:"answerA" gorm:"column:answer_a;type:varchar(256);not null;default:'';comment:正确答案"`
	//AnswerB string `json:"answerB" gorm:"column:answer_b;type:varchar(256);not null;default:'';comment:错误答案"`

	ProblemContent string `json:"problem_content"`  //问题内容
	ProblemAnswerA string `json:"problem_answer_a"` //问题内容
	ProblemAnswerB string `json:"problem_answer_b"` //问题内容
	ProblemRight   int32  `json:"problem_right"`    //0:A对;1:B对
}

type DanceModelGroupUser struct {
	OpenId  string `json:"open_id"`  //用户open_id
	GroupId string `json:"group_id"` //阵营id
}

// DanceCommonStatusResponse 请求抖音公共响应结果
type DanceCommonStatusResponse struct {
	ErrNo  int    `json:"errcode"`
	ErrMsg string `json:"errmsg"`
	Logid  string `json:"logid"`
}

// RockerSyncRoundGroupResult 小摇杆 同步对局状态结果到抖音
type RockerSyncRoundGroupResult struct {
	GroupId string `json:"group_id"` //阵营id，取值来源来自开发者平台「进阶礼物配置」的group_id，如：red
	Result  int    `json:"result"`   //对局结果（1=胜利、2=失败、3=平局）
}

// RockerUserGroupInfo 小摇杆 上报阵营数据到抖音
type RockerUserGroupInfo struct {
	AppId   string `json:"app_id"`   //小玩法app_id
	GroupId string `json:"group_id"` //阵营id，取值来源来自开发者平台「进阶礼物配置」的group_id，如：red
	OpenId  string `json:"open_id"`  //用户open_id
	RoomId  string `json:"room_id"`  //房间Id
	RoundId int64  `json:"round_id"` //对局Id
}

// RockerWorldRankList 小摇杆 上传世界榜单列表数据
type RockerWorldRankList struct {
	RankList []RockerWorldRankItem `json:"rank_list"` //世界榜单列表
}

type RockerWorldRankItem struct {
	OpenId             string `json:"open_id"`              //用户open_id
	Rank               int64  `json:"rank"`                 //世界榜单排名
	Score              int64  `json:"score"`                //当前用户的世界榜单积分
	WinningStreakCount int64  `json:"winning_streak_count"` //当前用户的连胜次数，如果没有连胜记录传0
	WinningPoints      int64  `json:"winning_points"`       //当前用户的胜点记录，如果没有胜点记录传0
}

// RockerUserWorldRankList 小摇杆 上报用户世界榜单的累计战绩
type RockerUserWorldRankList struct {
	UserList []RockerUserWorldRankItem `json:"user_list"` //世界榜单列表
}

type RockerUserWorldRankItem struct {
	OpenId             string `json:"open_id"`              //用户open_id
	Rank               int64  `json:"rank"`                 //用户的世界榜单排名,超过1000的，可以固定传递1000，抖音端会展示为 "999+"
	Score              int64  `json:"score"`                //当前用户的世界榜单积分
	WinningPoints      int64  `json:"winning_points"`       //当前用户的胜点记录，如果没有胜点记录传0
	WinningStreakCount int64  `json:"winning_streak_count"` //当前用户的连胜次数，如果没有连胜记录传0
}

// RockerModelUploadUserResultList 小摇杆 上报用户对局数据
type RockerModelUploadUserResultList struct {
	UserList []RockerModelUploadUserResultItem `json:"user_list"` //用户对局数据列表
}

type RockerModelUploadUserResultItem struct {
	OpenId             string `json:"open_id"`              //用户open_id
	Rank               int64  `json:"rank"`                 //用户的世界榜单排名,超过1000的，可以固定传递1000，抖音端会展示为 "999+"
	RoundResult        int    `json:"round_result"`         //对局结果（1=胜利、2=失败、3=平局）
	Score              int64  `json:"score"`                //核心数值,用户排名的依据
	WinningPoints      int64  `json:"winning_points"`       //当前用户的胜点记录，如果没有胜点记录传0
	WinningStreakCount int64  `json:"winning_streak_count"` //当前用户的连胜次数，如果没有连胜记录传0
	GroupId            string `json:"group_id"`             //阵营Id，比如 red/blue
}

// RockerModelUploadUserRankList 小摇杆 上报对局榜单列表
type RockerModelUploadUserRankList struct {
	RankList []RockerModelUploadUserRankItem `json:"rank_list"` //对局榜单列表
}

type RockerModelUploadUserRankItem struct {
	OpenId             string `json:"open_id"`              //用户open_id
	Rank               int64  `json:"rank"`                 //用户排名
	RoundResult        int    `json:"round_result"`         //对局结果（1=胜利、2=失败、3=平局）
	Score              int64  `json:"score"`                //核心数值,用户排名的依据
	WinningPoints      int64  `json:"winning_points"`       //当前用户的胜点记录，如果没有胜点记录传0
	WinningStreakCount int64  `json:"winning_streak_count"` //当前用户的连胜次数，如果没有连胜记录传0
	GroupId            string `json:"group_id"`             //阵营Id，比如 red/blue
}

// FullServerSpeaker 全服喇叭
//type FullServerSpeaker struct {
//	FullType        int32  `json:"full_type"`         //0:单人10个神秘空投，全服特效;1:结婚模式组成cp神秘空投;2:离婚全服喇叭
//	UserIdLeft      string `json:"user_id_left"`      //送礼人
//	UserNameLeft    string `json:"user_name_left"`    //送礼人
//	UserAvatarLeft  string `json:"user_avatar_left"`  //用户头像
//	UserIdRight     string `json:"user_id_right"`     //蹭礼物的
//	UserNameRight   string `json:"user_name_right"`   //蹭礼物的
//	UserAvatarRight string `json:"user_avatar_right"` //蹭礼物的
//}

type DrawPrizeConditions struct {
	ActivitiesConditionId     int64 `json:"activities_condition_id"`     //抽奖条件id
	TypeActivitiesOne         int   `json:"conditions_type_one"`         //一级类型
	TypeActivities            int   `json:"conditions_type"`             //二级类型 -1:星光值 80:碎片
	ConditionsValue           int64 `json:"conditions_value"`            // 奖品编号(道具或者服饰编号，或者星光值)
	ConditionsValueProportion int   `json:"conditions_value_proportion"` //中奖比例
	SplinterNum               int64 `json:"splinter_num"`                //直抽碎片数量 (抽中碎片，数量可以是多个)
	ValidityPeriod            int   `json:"validity_period"`             //奖品有效期(时)/星光值
	Start                     int   `json:"start"`                       //抽奖左边限制
	End                       int   `json:"end"`                         //抽奖右边限制
	Tag                       int   `json:"tag"`                         //等级
	ExchangeNumber            int   `json:"exchange_number"`             // 兑换碎片数量，星光值和碎片为0
	PieceElementNo            int64 `json:"piece_element_no"`            // 碎片编号
}

// DrawPrizeConditionsExchange 服饰兑换碎片条件
type DrawPrizeConditionsExchange struct {
	ActivitiesId      int64 `json:"activitiesId"`      // 活动id
	TypeActivitiesOne int   `json:"conditionsTypeOne"` //一级类型
	TypeActivities    int   `json:"conditionsType"`    //二级类型 -1:星光值 80:碎片
	ExchangeNumber    int   `json:"exchangeNumber"`    // 兑换碎片数量，星光值和碎片为0
	PieceElementNo    int64 `json:"pieceElementNo"`    // 碎片编号
	ElementNo         int64 `json:"elementNo"`
	ElementNum        int64 `json:"elementNum"` // 兑换的服饰数量/一个碎片
	ValidityPeriod    int64 `json:"validityPeriod"`
}

// DrawPrizeExchangeScoreConditions 碎片兑换星光值条件
type DrawPrizeExchangeScoreConditions struct {
	ActivitiesId      int64 `json:"activitiesId"`      // 活动id
	TypeActivitiesOne int   `json:"conditionsTypeOne"` //一级类型
	TypeActivities    int   `json:"conditionsType"`    //二级类型 -1:星光值 80:碎片
	PieceElementNo    int64 `json:"pieceElementNo"`    // 碎片编号
	ExchangeScore     int64 `json:"exchangeScore"`     // 兑换的星光值数量
}

// DrawPrizeExchangeTripScoreConditions 碎片兑换旅途点条件
type DrawPrizeExchangeTripScoreConditions struct {
	ActivitiesId      int64 `json:"activitiesId"`      // 活动id
	TypeActivitiesOne int   `json:"conditionsTypeOne"` //一级类型
	TypeActivities    int   `json:"conditionsType"`    //二级类型 -2:旅途点
	PieceElementNo    int64 `json:"pieceElementNo"`    // 碎片编号
	ExchangeScore     int64 `json:"exchangeScore"`     // 兑换的旅途点
}

// DrawPrizeBaseNumbersConditions 非关系赠送次数基础配置条件
type DrawPrizeBaseNumbersConditions struct {
	ActivitiesId int64 `json:"activitiesId"` // 活动id
	ElementNo    int64 `json:"elementNo"`    // 碎片编号
	Numbers      int64 `json:"numbers"`      // 赠送次数
}

// DrawPrizeExtraNumbersConditions 非关系满赠配置条件
type DrawPrizeExtraNumbersConditions struct {
	ActivitiesId int64 `json:"activitiesId"` // 活动id
	LotteryNum   int64 `json:"lotteryNum"`   // 满足对应的抽奖次数
	ElementNo    int64 `json:"elementNo"`    // 碎片编号
	Numbers      int64 `json:"numbers"`      // 赠送次数
}

type DrawPrizeInfo struct {
	CanDraw                                  bool                                   `json:"can_draw"`                                       //是否可以抽奖
	ActivitiesId                             int64                                  `json:"activities_id"`                                  //活动id
	IsUp                                     int                                    `json:"is_up"`                                          //0:未上架 1:上架中 2 下架
	StartTime                                int64                                  `json:"start_time"`                                     //活动开始时间
	EndTime                                  int64                                  `json:"end_time"`                                       //活动结束时间
	MinNumber                                int64                                  `json:"min_number"`                                     // 第一行最小数量(前*次抽奖)
	MaxNumber                                int64                                  `json:"max_number"`                                     // 第一行最大数量(前*次抽奖)
	MinNumberTwoLine                         int64                                  `json:"min_number_two_line"`                            // 第二行最小数量
	MaxNumberTwoLine                         int64                                  `json:"max_number_two_line"`                            // 第二行最大数量
	MinNumberThreeLine                       int64                                  `json:"min_number_three_line"`                          // 第三行最小数量
	MaxNumberThreeLine                       int64                                  `json:"max_number_three_line"`                          // 第三行最大数量
	ActivitiesRules                          string                                 `json:"activitiesRules"`                                // 活动规则1
	ActivitiesContent                        string                                 `json:"activitiesContent"`                              // 活动规则2
	Icon                                     string                                 `json:"icon"`                                           // 活动规则2
	DrawPrizeConditionsList                  []DrawPrizeConditions                  `json:"draw_prize_conditions_list"`                     //抽奖条件
	DrawChoiceList                           []wr.Choice                            `json:"draw_choice_list"`                               //抽奖条件
	DrawPrizeConditionsListExchange          []DrawPrizeConditionsExchange          `json:"draw_prize_conditions_list_exchange"`            //服饰兑换碎片条件
	DrawPrizeExchangeScoreConditionsList     []DrawPrizeExchangeScoreConditions     `json:"draw_prize_exchange_score_conditions_list"`      //碎片兑换星光值条件
	DrawPrizeExchangeTripScoreConditionsList []DrawPrizeExchangeTripScoreConditions `json:"draw_prize_exchange_trip_score_conditions_list"` //碎片兑换旅途点条件
	DrawPrizeBaseNumbersConditionsList       []DrawPrizeBaseNumbersConditions       `json:"draw_prize_base_numbers_conditions_list"`        //非关系赠送次数基础配置
	DrawPrizeExtraNumbersConditionsList      []DrawPrizeExtraNumbersConditions      `json:"draw_prize_extra_numbers_conditions_list"`       //非关系满赠配置
	DrawPrizeConditionsListTags              map[int][]DrawPrizeConditions          `json:"draw_prize_conditions_list_tags"`                // map[tag]奖品
	DrawPrizeConditionsListTagsLockRw        *sync.RWMutex
	OtherPrized                              []DrawPrizeConditions `json:"other_prized"` //四等奖
}

type BagDetailRedis struct {
	ElementType   int   `json:"element_type"`
	ElementNo     int64 `json:"element_no"`
	ElementNumber int32 `json:"element_number"` //碎片累加，其他道具默认1
	ExpiredTime   int64 `json:"expired_time"`
}

type BagDetail struct {
	ElementType   int   `json:"element_type"`
	ElementNo     int64 `json:"element_no"`
	ElementNumber int32 `json:"element_number"` //碎片累加，其他道具默认1
	ExpiredHour   int64 `json:"expired_hour"`
}

type DrawPrizeActivityInfo struct {
	DrawPrizeSyncMap     sync.Map              `json:"draw_prize_sync_map"`     // key:活动id value:DrawPrizeInfo
	CurrentDrawPrizeInfo DrawPrizeInfo         `json:"current_draw_prize_info"` //当前在用的抽奖活动
	CanDraw              bool                  `json:"can_draw"`                //是否可以抽奖
	OtherPrized          []DrawPrizeConditions `json:"other_prized"`            //四等奖
}

type DrawPrizeNumber struct {
	RuleOneNum   int64 //保底配置第一行,累加抽奖次数
	RulerTwoNum  int64 //保底配置第二行,累加抽奖次数
	RuleThreeNum int64 //保底配置第三行,累加抽奖次数
}

type FullServiceAnnouncementList struct {
	NoticeContent []string
}

func (d *DrawPrizeActivityInfo) GetDrawPrizeSyncMap(key int64) (DrawPrizeInfo, bool) {
	value, ok := d.DrawPrizeSyncMap.Load(key)
	if value == nil {
		s := DrawPrizeInfo{}
		return s, false
	}
	s := value.(DrawPrizeInfo)
	return s, ok
}

// TripActivityInfo 旅途活动信息
type TripActivityInfo struct {
	IsValid                      bool                                   `json:"is_valid"`                         //是否有效
	ActivitiesId                 int64                                  `json:"activities_id"`                    //活动id
	ActivitiesRules              string                                 `json:"activities_rules"`                 //活动规则
	ActivitiesRulesTwo           string                                 `json:"activities_rules_two"`             //活动规则2
	PartyMicrophone              int64                                  `json:"party_microphone"`                 // 派对话筒赠送旅途点数
	ActivitiesIcon               string                                 `json:"activities_icon"`                  //活动图片
	Name                         string                                 `json:"name"`                             // 活动名称
	StartTime                    int64                                  `json:"start_time"`                       // 开始时间
	EndTime                      int64                                  `json:"end_time"`                         // 结束时间
	CreatedId                    int64                                  `json:"created_id"`                       // 创建人id
	UpdateId                     int64                                  `json:"update_id"`                        // 更新人id
	IsUp                         int                                    `json:"is_up"`                            //0:未上架 1:上架中
	Remark                       string                                 `json:"remark"`                           // 备注
	DayTaskList                  []TripDayTaskInfo                      `json:"day_task_list"`                    //每日任务列表
	DayTaskListSyncMap           *sync.Map                              `json:"day_task_list_sync_map"`           //key:任务id value:TripDayTaskInfo 每日任务列表
	LevelExpList                 TripLevelExplSlices                    `json:"level_exp_list"`                   //等级经验列表
	LevelExpSyncMap              *sync.Map                              `json:"level_exp_sync_map"`               //key:等级 value:TripExpLevelConditions 经验
	LevelPrizeConditionsListTags map[int64]TripLevelPrizeConditionsList `json:"level_prize_conditions_list_tags"` //map[等级] 等级与奖品条件
	LevelPrizeConditionsSyncMap  *sync.Map                              `json:"level_prize_conditions_sync_map"`  // key:等级 value:TripLevelPrizeConditionsList 等级与奖品条件
}

type TripLevelPrizeConditionsList []TripLevelPrizeConditions
type TripLevelExplSlices []TripExpLevelConditions

// SortExpAsc 切片排序: 右边经验值升序
func (t TripLevelExplSlices) SortExpAsc() []TripExpLevelConditions {
	sort.Slice(t, func(i, j int) bool {
		return t[i].MaxLimit < t[j].MaxLimit
	})
	return t
}

// ExpMatchMaxLevel 经验值匹配最大等级
func (t TripLevelExplSlices) ExpMatchMaxLevel(TripScore int64) (int64, bool) {
	t.SortExpAsc()

	var cfgMaxLevel int64 // 配置的最大等级
	isMaxLevel := false
	if len(t) > 0 {
		// 旅途点>=最大经验值，返回true
		if t[len(t)-1].MaxLimit <= TripScore {
			isMaxLevel = true
		}
		cfgMaxLevel = t[len(t)-1].Level
	}
	return cfgMaxLevel, isMaxLevel
}

// ExpMatchCurrentLevel 经验值匹配当前等级
func (t *TripActivityInfo) ExpMatchCurrentLevel(tripScore int64) int64 {
	var currentLevel int64
	// 先匹配是否已是最大等级
	cfgMaxLevel, isMax := t.LevelExpList.ExpMatchMaxLevel(tripScore)
	if isMax {
		currentLevel = cfgMaxLevel
		return currentLevel
	}

	// 不是最大等级，循环匹配
	t.LevelExpSyncMap.Range(func(key, value interface{}) bool {
		level := key.(int64)
		condition := value.(TripExpLevelConditions)
		if condition.MinLimit <= tripScore && condition.MaxLimit >= tripScore {
			currentLevel = level
			return false // 结束循环
		}
		return true
	})
	return currentLevel
}

// TripDayTaskInfo 旅途每日任务
type TripDayTaskInfo struct {
	Id      int64  //任务id
	Content string //任务内容
	Num     int64  //任务数量
	Score   int64  //获得点数
}

// TripExpLevelConditions 旅途经验与等级条件
type TripExpLevelConditions struct {
	MinLimit int64 //最小经验
	MaxLimit int64 //最大经验
	Level    int64 //等级
}

// TripLevelPrizeConditions 旅途等级与奖品条件
type TripLevelPrizeConditions struct {
	Level             int64 //等级
	TypeActivitiesOne int   // 奖品一级类型
	TypeActivities    int   // 二级类型
	ElementNo         int64 // 道具编号
	EffectTime        int64 // 时效:小时
	Num               int64 // 数量
}

// TripDayTaskUserFinishInfo 旅途每日任务用户完成情况
type TripDayTaskUserFinishInfo struct {
	Id        int64  //任务id
	Content   string //任务内容
	FinishNum int64  //任务完成数量
	TotalNum  int64  //任务总数量
}

// StarPointsJoins 星光值活动join条件配置
type StarPointsJoins struct {
	Name            string `json:"name"`             //活动名
	ActivitiesRules string `json:"activities_rules"` //活动规则
	ActivitiesIcon  string `json:"activities_icon"`  //活动icon
	StartTime       int64  `json:"start_time"`       //开始时间
	EndTime         int64  `json:"end_time"`         //结束时间
	ConditionId     int64  `json:"condition_id"`     //活动条件配置id
	Score           int64  `json:"score"`            //累计积分
	EffectTime      int64  `json:"effect_time"`      //有效时长(小时)
	ElementName     string `json:"element_name"`     //散件名
	ElementNo       string `json:"element_no"`       //散件编号
	ElementIcon     string `json:"element_icon"`     //散件icon
}

// HaloRankUserInfo 星光值用户排名
type HaloRankUserInfo struct {
	TotalScore int64  `json:"total_score,omitempty"` //累计积分
	WorldRank  int32  `json:"world_rank,omitempty"`
	Nickname   string `json:"nickname,omitempty"` //昵称
	Avatar     string `json:"avatar,omitempty"`   //头像
}

// SuitElementInfo 套装散件信息
type SuitElementInfo struct {
	SuitId      int64  `json:"suit_id"`      //套装id
	ElementId   int64  `json:"element_id"`   //散件id
	ElementNo   string `json:"element_no"`   //散件编号
	PropType    int    `json:"prop_type"`    //一级类型  1:服饰 2:道具 3:功能 -1:星光值
	ElementType int    `json:"element_type"` //二级类型
}

// TripRankUserInfo 旅途用户排行
type TripRankUserInfo struct {
	Uid   string `json:"uid"`   //uid
	Level int64  `json:"level"` //等级
	Score int64  `json:"score"` //旅途点
	Rank  int    `json:"rank"`  //世界排名
}

// 商城信息
type ShopMallInfo struct {
	ShopMallGoodSyncMap       sync.Map           `json:"shop_mall_good_sync_map"`        // key:商品唯一id value:ShopMallGoodInfo
	ShopMallGoodChangeSyncMap sync.Map           `json:"shop_mall_good_change_sync_map"` // key:商品变更记录唯一id value:ShopMallGoodInfo
	ShopMallGoodList          []ShopMallGoodInfo `json:"shop_mall_good_list"`            // 商品信息列表
}

// ShopMallGoodInfo 商城商品信息
type ShopMallGoodInfo struct {
	GoodId            int64  `json:"good_id"`             // 商品唯一id
	GoodChangeLogId   int64  `json:"good_change_log_id"`  // 商品变更记录唯一id
	TimeLabel         int    `json:"time_label"`          // 时间标签
	StartTime         int64  `json:"start_time"`          // 开始时间
	EndTime           int64  `json:"end_time"`            // 结束时间
	LabelNumber       int64  `json:"label_number"`        // 商品序号
	Number            int64  `json:"number"`              // 商品数量
	OldPrice          int64  `json:"old_price"`           // 原价格
	Price             int64  `json:"price"`               // 价格
	Discount          int    `json:"discount"`            // 折扣
	SortNumber        int64  `json:"sort_number"`         // 排序
	ElementNo         int64  `json:"element_no"`          // 散件编号
	ElementName       string `json:"element_name"`        // 散件名字
	EffectiveTime     int64  `json:"effective_time"`      // 商品时长(小时)
	Score             int64  `json:"score"`               // 星光值
	TripScore         int64  `json:"trip_score"`          // 旅途点
	ConditionsTypeOne int    `json:"conditions_type_one"` // 一级类型
	ConditionsType    int    `json:"conditions_type"`     // 二级类型
	IsUp              int    `json:"is_up"`               // 0:未上架 1:上架中
}

// 商品变化通知
type ShopMallChangeList struct {
	AddList    []ShopMallGoodChangeItem //商品新增列表
	UpdateList []ShopMallGoodChangeItem //商品更新列表
	DeleteList []ShopMallGoodChangeItem //商品删除列表
}

type ShopMallGoodChangeItem struct {
	GoodChangeLogId int64 //商品变更记录唯一id
	ElementNo       int64 //商品道具编号
	LabelNumber     int32 //商品序号
	SortNumber      int32 //商品权重号,最大的在前面
	OldPrice        int64 //商品原价
	Price           int64 //商品真实价格
	IsTimeLimit     int32 //限时 0:不限 1:限时
	EffectiveTime   int32 //有效时间，小时为单位
	ExpireTime      int64 //商品过期时间
	DrawType        int32 //1:道具;2:星光值;3旅途点
	Number          int32 //商品数量
	Score           int64 //星光值数量
	TripScore       int64 //旅途点
}

// 宠物信息
type PetInfo struct {
	PetNoSyncMap   sync.Map    `json:"pet_no_sync_map"`   // 宠物信息map key:宠物编号 value:PetItem
	PetTypeSyncMap sync.Map    `json:"pet_type_sync_map"` // 宠物信息map key:宠物类型id value:PetItemList
	PetList        PetItemList `json:"pet_list"`          // 宠物信息列表
	//PetEggConditionList        PetEggConditionItemList           `json:"pet_egg_condition_list"`       // 宠物蛋配置列表
	PetEggConditionListMap     map[int64]PetEggConditionItemList `json:"pet_egg_condition_list_tag"`   // map[宠物蛋编号] 宠物蛋配置
	PetEggConditionSyncMap     sync.Map                          `json:"pet_egg_condition_sync_map"`   // key:宠物蛋编号 value:PetEggConditionItemList 宠物蛋配置
	ReincarnationConditionList []ReincarnationCondition          `json:"reincarnation_condition_list"` // 转生等级对应表
}

type PetItemList []PetItem
type PetEggConditionItemList []PetEggConditionItem

// 宠物活动信息
type PetActivities struct {
	Id             int64  // 活动id
	ActivitiesIcon string // 活动图片
	Name           string // 活动名称
	StartTime      int64  // 开始时间
	EndTime        int64  // 结束时间
	CreatedId      int64  // 创建人id
	UpdateId       int64  // 更新人id
	IsUp           int    //0:未上架 1:上架中
	Remark         string
}

// 宠物信息
type PetItem struct {
	Id          int64  `json:"id"`            // 宠物id
	PetNo       int64  `json:"pet_no"`        // 宠物编号
	PetName     string `json:"pet_name"`      // 宠物名称
	Quality     int    `json:"quality"`       // 品质
	PetTypeId   int64  `json:"pet_type_id"`   // 宠物类型id
	PetTypeName string `json:"pet_type_name"` // 宠物类型名
	PetIcon     string `json:"pet_icon"`      // 宠物icon
}

// 宠物蛋配置
type PetEggConditionItem struct {
	Id                        int64 // 条件id
	ConditionsValueProportion int64 //命中比例
	Start                     int64 // 命中区间开始，根据奖品命中概率计算
	End                       int64 // 命中区间结束，根据奖品命中概率计算
	PetEggNo                  int64 // 宠物蛋编号
	PetNo                     int64 // 宠物编号
	PetTypeId                 int64 // 宠物类型id
}

// 转生等级对应表
type ReincarnationCondition struct {
	Id            int64 //
	Reincarnation int   // 转生
	Grade         int   // 等级
	Quality       int   // 品质
	PetTypeId     int   // 宠物类型id
	PetNumMin     int   // 需要宠物的最小数量
	PetNumMax     int   // 需要宠物的最大数量
}

// CityInfo 城池信息
type CityInfo struct {
	Id                   int64
	CityNo               int64  // 城池编号
	CityType             int    // 城池类型
	ModelNo              int64  // 模版编号
	HostId               string // 组合名字
	TeamId               int    //
	ClearAt              int64  // 更新人id
	OccupyTimeAt         int64  // 占领时间
	ActivityId           int64  // 更新人id
	Status               int    // 是否缓存 0否 1是
	CityStamina          int    // 每分钟消耗的体力值
	MongoCityChangeLogId string // mongo城池变更记录id
}
